package Tp2Principal;

import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Usager
 */
public class Damier extends JPanel {

    Fenetre fenetre;
    Parties nouvellePartie = new Parties();
    int action = nouvellePartie.action; //lorsque l'utilisateur cliquera, ce sera sur le pion qu'il veut déplacer
    Joueur joueurCourant;
    GererDamier souris;
    int dimension = nouvellePartie.dimension;
    Case[][] tabCases = new Case[dimension][dimension];
    boolean[][] caseRemplie = new boolean[dimension][dimension];
    boolean[][] caseRouge = new boolean[dimension][dimension];
    boolean[][] caseGris = new boolean[dimension][dimension];
    boolean[][] caseDoubler = new boolean[dimension][dimension];
    boolean[][] caseDeplacer = new boolean[dimension][dimension];
    boolean[][] superRedd = new boolean[dimension][dimension];
    boolean super1 = false; //le SuperRedd n'a jamais été utilisé par le joueur1
    boolean super2 = false; //le SuperRedd n'a jamais été utilisé par le joueur2

    public static enum Joueur {

        JOUEUR1,
        JOUEUR2
    };

    public Damier(Fenetre fenetre) {
        this.setLayout(new GridLayout(dimension, dimension));
        this.fenetre = fenetre;
        joueurCourant = Joueur.JOUEUR1; //initialisé à Joueur1        
        souris = new GererDamier();

        //Creation des cases
        for (int i = 0; i < dimension; i++) {
            for (int j = 0; j < dimension; j++) {
                if ((i + j) % 2 == 0) {
                    tabCases[i][j] = new Case(true);
                    this.add(tabCases[i][j]);
                } else {
                    tabCases[i][j] = new Case(false);
                    this.add(tabCases[i][j]);
                }
                tabCases[i][j].addMouseListener(souris);
                caseRemplie[i][j] = false; //toutes les cases sont initialisées à vides                
            }
        }

        reinitialise();

        fenetre.chkSuper.addItemListener(souris);
        fenetre.btnAbandonner.addMouseListener(souris);
    }

    public void reinitialise() {
        souris.reinitialise();
    }

    public class GererDamier extends MouseAdapter implements ItemListener {

        Case caseAutour;//case autour du pion placé
        Case caseCourant; //case qui vient d'être cliquée
        Case caseCliquee; //case où se trouve le pion initialement
        int indexX; //index en X de la case cliquée
        int indexY; //index en Y de la case cliquée
        int indexCliqueeX; //index en X de la case où se trouve le pion initialement
        int indexCliqueeY; //index en Y de la case où se trouve le pion initialement
        boolean valide = false; //si la case contient un pion donc peut être cliquée la 1ere fois
        Pion pionClique;
        int pions1;
        int pions2;
        boolean superSelect;
        Pion pionCourant;
        boolean fin=false;

        public void itemStateChanged(ItemEvent ie) {
            /*if (ie.getSource() == fenetre.chkSuper)
            {
                if (fenetre.chkSuper.isSelected())
                {
                    if (joueurCourant == Joueur.JOUEUR1)
                    {
                        super1 = true;
                    }
                    else
                    {
                        super2 = true;
                    }
                    superSelect=true;
                }
                else
                {
                    superSelect=false;
                }
                fenetre.getRootPane().revalidate();
                fenetre.repaint();
                
            }*/
        }

        @Override
        public void mouseReleased(MouseEvent me) {
            if(me.getSource()==fenetre.btnAbandonner)
            {
                fin=true;
                finPartie();
            }
            else
            {
                caseCourant = (Case) me.getSource();

                //On trouve les index de la case courante
                for (int i = 0; i < dimension; i++)
                {
                    for (int j = 0; j < dimension; j++)
                    {
                        if (caseCourant == tabCases[i][j])
                        {
                            indexX = i;
                            indexY = j;
                        }
                    }
                }

                if (action == 0) //on clique sur le pion à déplacer
                {
                    premierClick();
                } else //action=1, on clique sur la case où ira le pion
                {
                    deuxiemeClick();
                }
            }
        }

        public void premierClick() {
            //on retient la case cliquée et ses index
            caseCliquee = caseCourant;
            indexCliqueeX = indexX;
            indexCliqueeY = indexY;

            for (int i = 0; i < dimension; i++)
            {
                for (int j = 0; j < dimension; j++)
                {
                    caseDoubler[i][j] = false; //toutes les cases sont initialisées à non-valides
                    caseDeplacer[i][j] = false; //toutes les cases sont initialisées à non-valides
                }
            }

            if (caseRemplie[indexX][indexY]) //s'il y a un pion sur la case
            {
                if (cliquable(indexX, indexY)) //si c'est le bon joueur qui joue
                {
                    valide = true;
                    pionClique = caseCliquee.getPion();
                    pionClique.setCouleur(Color.GREEN);
                    valideSuper();
                    caseRemplie();
                } else
                {
                    JOptionPane.showMessageDialog(null, "C'est au tour du " + joueurCourant, "Mauvais Joueur", JOptionPane.WARNING_MESSAGE);
                    pionClique = null;
                }
            }
        }

        public boolean cliquable(int indexX, int indexY) //le joueur qui clique est valide ou non
        {
            boolean valide = false;

            if (((joueurCourant == Joueur.JOUEUR1) && (caseRouge[indexX][indexY] == true)) || ((joueurCourant == Joueur.JOUEUR2) && (caseGris[indexX][indexY] == true))) {
                valide = true; //c'est le bon joueur qui a cliqué
            }
            return (valide);
        }

        public void caseRemplie() {
            action = 1; //au prochain click, on saura que c'est le deuxième
            if (indexX != 0) {
                colonnePasNulle(); //Le pion n'est pas dans la 1ere colonne
            }

            if (indexX != (dimension - 1)) {
                colonnePasFin(); //Le pion n'est pas dans la dernière colonne
            }

            if (indexY != 0) {
                rangeePasNulle();//Le pion n'est pas dans la première rangée
            }

            if (indexY != (dimension - 1)) {
                rangeePasFin();//Le pion n'est pas dans la dernière rangée
            }

        }

        public void colonnePasNulle() //le pion n'est pas dans la 1ere colonne
        {
            caseDoubler[indexX - 1][indexY] = true;
            if (indexY != 0) //le pion n'est pas dans la 1ere rangée
            {
                //caseDoubler[indexX][indexY-1]=true; ???ici?
                caseDoubler[indexX - 1][indexY - 1] = true;
                if (indexY != 1) {
                    caseDeplacer[indexX - 1][indexY - 2] = true;
                }

            }
            if (indexY != (dimension - 1)) //le pion n'est pas dans la denière rangée
            {
                caseDoubler[indexX - 1][indexY + 1] = true;
                if (indexY != (dimension - 2)) //le pion n'est pas dans l'avant-dernière rangée
                {
                    caseDeplacer[indexX - 1][indexY + 2] = true;
                }

            }
            if (indexX != 1) //le pion est dans la 2em colonne ou plus
            {
                caseDeplacer[indexX - 2][indexY] = true;
                if (indexY != 0) //le pion n'est pas dans la 1ere rangée
                {
                    caseDeplacer[indexX - 2][indexY - 1] = true;
                    if (indexY != 1) //le pion est dans la 2em rangée ou plus
                    {
                        caseDeplacer[indexX - 2][indexY - 2] = true;
                    }

                }
                if (indexY != (dimension - 1)) //le pion n'est pas dans la dernière rangée
                {
                    caseDeplacer[indexX - 2][indexY + 1] = true;
                    if (indexY != (dimension - 2)) //le pion est avant l'avant-dernière rangée
                    {
                        caseDeplacer[indexX - 2][indexY + 2] = true;
                    }

                }
            }
        }

        public void colonnePasFin() //le pion n'est pas dans la dernière colonne
        {
            caseDoubler[indexX + 1][indexY] = true;
            if (indexY != 0) //le pion n'est pas dans la 1ere rangée
            {
                caseDoubler[indexX + 1][indexY - 1] = true;
                if (indexY != 1) //le pion est dans la 2em rangée ou plus
                {
                    caseDeplacer[indexX + 1][indexY - 2] = true;
                }

            }
            if (indexY != (dimension - 1)) //le pion n'est pas dans la dernière rangée
            {
                caseDoubler[indexX + 1][indexY + 1] = true;
                if (indexY != (dimension - 2))//le pion est avant l'avant-derière rangée
                {
                    caseDeplacer[indexX + 1][indexY + 2] = true;
                }

            }
            if (indexX != (dimension - 2)) //le pion est avant l'avant-dernière rangée
            {
                caseDeplacer[indexX + 2][indexY] = true;
                if (indexY != 0) //le pion n'est pas dans la 1ere rangée
                {
                    caseDeplacer[indexX + 2][indexY - 1] = true;
                    if (indexY != 1) //le pion est dans la 2em rangée ou plus
                    {
                        caseDeplacer[indexX + 2][indexY - 2] = true;
                    }

                }
                if (indexY != (dimension - 1)) //le pion n'est pas dans la dernière rangée
                {
                    caseDeplacer[indexX + 2][indexY + 1] = true;
                    if (indexY != (dimension - 2)) //le pion n'est pas dans l'avant-dernière rangée
                    {
                        caseDeplacer[indexX + 2][indexY + 2] = true;
                    }

                }
            }
        }

        public void rangeePasNulle() //le pion n'est pas dans la 1ere rangée
        {
            caseDoubler[indexX][indexY - 1] = true; //le pion n'est pas dans la 1ere rangée
            if (indexY != 1) //le pion est après la 2em rangée
            {
                caseDeplacer[indexX][indexY - 2] = true;
            }

        }

        public void rangeePasFin() //le pion n'est pas dans la dernière rangée
        {
            caseDoubler[indexX][indexY + 1] = true; //le pion n'est pas dans la dernière rangée
            if (indexY != (dimension - 2)) //le pion est avant l'avant-dernière rangée
            {
                caseDeplacer[indexX][indexY + 2] = true;
            }

        }

        public void deuxiemeClick() //on clique sur la case où ira le pion
        {
            if(caseCourant==caseCliquee) //si on veut déselectionner la case
            {
                pionClique.setCouleur(joueurCourant);
                action=0;
            }
            
            else //si on clique sur une autre case
            {            
                 superReddUtilise();

                 //le pion peut être doublé vers cette case
                if ((caseDoubler[indexX][indexY]) && !(caseRemplie[indexX][indexY]))
                {
                    doubler();
                }
                //le pion peut être déplacé vers cette case
                else if ((caseDeplacer[indexX][indexY]) && !(caseRemplie[indexX][indexY]))
                {
                    deplacer();
                }
                else
                {
                    JOptionPane.showMessageDialog(null, "Vous ne pouvez pas " + "déplacer le pion à cet endroit.");
                }
            }
        }
        
        public void superReddUtilise()//indique si le SuperRedd a été utilisé
        {
            if (fenetre.chkSuper.isSelected()) //si le SuperRedd est sélectionné
                {
                    if (joueurCourant == Joueur.JOUEUR1)
                    {
                        super1 = true;
                    }
                    else
                    {
                        super2 = true;
                    }
                    superSelect=true;
                }
                else
                {
                    superSelect=false;
                }
                fenetre.getRootPane().revalidate();
                fenetre.repaint();
        }

        public void doubler() {

            action = 0; //au prochain clique, on cliquera sur un pion qu'on veut déplacer

            pionClique.setCouleur(joueurCourant);

            caseCourant.setPion(joueurCourant);

            if(superSelect)
            {
                superRedd();
            }

            caseRemplie[indexX][indexY] = true; //la case a un pion

            if (joueurCourant == Joueur.JOUEUR1)
            {
                caseRouge[indexX][indexY] = true; //la case a un pion rouge
            } else
            {
                caseGris[indexX][indexY] = true; //la case a un pion gris
            }

            changementCouleur();
            nbPions();
            changementJoueur();

            fenetre.getRootPane().revalidate();
            fenetre.repaint();

        }

        public void deplacer() {
            action = 0;//au prochain clique, on cliquera sur un pion qu'on veut déplacer        

            caseCourant.setPion(joueurCourant);
            caseRemplie[indexX][indexY] = true; //la case a un pion

            if(superSelect)
            {
                superRedd();
            }

            caseCliquee.removeAll();
            caseRemplie[indexCliqueeX][indexCliqueeY] = false; //la case cliquée n'a plus de pion

            if (joueurCourant == Joueur.JOUEUR1) {
                caseRouge[indexX][indexY] = true; //la case a un pion rouge
                caseRouge[indexCliqueeX][indexCliqueeY] = false; //la case n'a pas de pion rouge
            } else {
                caseGris[indexX][indexY] = true; //la case a un pion gris
                caseGris[indexCliqueeX][indexCliqueeY] = false; //la case n'a pas de pion rouge
            }
            changementCouleur();
            nbPions();
            changementJoueur();

            fenetre.getRootPane().revalidate();
            fenetre.repaint();
        }

        public void changementJoueur() {
            if (joueurCourant == Joueur.JOUEUR1)
            {
                joueurCourant = Joueur.JOUEUR2;
                fenetre.lblCourant.setText("C'est le tour du joueur 2.");
            } else if (joueurCourant == Joueur.JOUEUR2)
            {
                joueurCourant = Joueur.JOUEUR1;
                fenetre.lblCourant.setText("C'est le tour du joueur 1.");
            }
            if (fenetre.chkSuper.isSelected())
            {
                 fenetre.chkSuper.setSelected(false);
            }
            finPartie();
            fenetre.chkSuper.setEnabled(false);
            
            

        }

        //SuperRedd peut être coché ou non
        public void valideSuper() {
            if ((joueurCourant == Joueur.JOUEUR1) && (!super1))
            {
                fenetre.chkSuper.setEnabled(true);
            }
            if ((joueurCourant == Joueur.JOUEUR2) && (!super2))
            {
                fenetre.chkSuper.setEnabled(true);
            }
        }

        //Pour changer les Pions de couleur après un déplacement
        public void changementCouleur()
        {
            if (joueurCourant == Joueur.JOUEUR1)//change les pions gris en rouges
            {
                //si le pion est dans le coin en haut à gauche
                if (indexX == 0 && indexY == 0)
                {
                    j1CoinHautGauche();
                }
                //si le pion est dans le coin en haut à droite
                else if (indexX == (dimension - 1) && indexY == 0)
                {
                    j1CoinHautDroite();
                }
                //si le pion est dans le coin en bas à gauche
                else if (indexX == 0 && indexY == (dimension - 1))
                {
                    j1CoinBasGauche();
                }
                //Si le pion est dans le coin en bas à droite
                else if (indexX == (dimension - 1) && indexY == (dimension - 1))
                {
                    j1CoinBasDroite();
                }
                //si le pion est dans la première ou dernière colonne
                else if (indexX == 0 || indexX == (dimension - 1))
                {
                    j1Colonnes();
                }
                //si le pion est dans la première ou dernière rangée
                else if (indexY == 0 || indexY == (dimension - 1))
                {
                    j1Rangees();
                }
                //pour les pions au centre du damier
                else
                {
                    j1Centre();
                }
            }
            else if (joueurCourant == Joueur.JOUEUR2)//change les pions rouges autour en gris
            {
                //Si le pion est dans le coin en haut à gauche
                if (indexX == 0 && indexY == 0)
                {
                    j2CoinHautGauche();
                }
                //Si le pion est dans le coin en haut à droite
                else if (indexX == (dimension - 1) && indexY == 0)
                {
                    j2CoinHautDroite();
                }
                //Si le pion est dans le coin en bas à gauche
                else if (indexX == 0 && indexY == (dimension - 1))
                {
                    j2CoinBasGauche();
                }
                //Si le pion est dans le coin en bas à droite
                else if (indexX == (dimension - 1) && indexY == (dimension - 1))
                {
                    j2CoinBasDroite();
                }
                //si le pion est dans la première ou dernière colonne
                else if (indexX == 0 || indexX == (dimension - 1))
                {
                    j2Colonnes();
                }
                //si le pion est dans le première ou dernière rangée
                else if (indexY == 0 || indexY == (dimension - 1))
                {
                    j2Rangees();
                }
                //Si le pion est au centre du damier
                else
                {
                    j2Centre();
                }
            }
            if(superSelect)
            {
                superRedd();
                superSelect=false;
            }
            fenetre.getRootPane().revalidate();
            fenetre.repaint();
        }

        //Joueur1: si le pion est dans le coin en haut à gauche
        public void j1CoinHautGauche()
        {
            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = false;
                caseRouge[indexX + 1][indexY] = true;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = false;
                caseRouge[indexX][indexY + 1] = true;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à droite en bas
            if (caseRemplie[indexX + 1][indexY + 1]) {
                caseGris[indexX + 1][indexY + 1] = false;
                caseRouge[indexX + 1][indexY + 1] = true;
                tabCases[indexX + 1][indexY + 1].removeAll();
                tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
            }
        }

        //Joueur1: si le pion est dans le coin en haut à droite
        public void j1CoinHautDroite() {
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = false;
                caseRouge[indexX][indexY + 1] = true;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche en bas
            if (caseRemplie[indexX - 1][indexY + 1]) {
                caseGris[indexX - 1][indexY + 1] = false;
                caseRouge[indexX - 1][indexY + 1] = true;
                tabCases[indexX - 1][indexY + 1].removeAll();
                tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = false;
                caseRouge[indexX - 1][indexY] = true;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }
        }

        //Joueur1: si le pion est dans le coin en bas à droite
        public void j1CoinBasDroite() {
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = false;
                caseRouge[indexX - 1][indexY] = true;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }

            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = false;
                caseRouge[indexX][indexY - 1] = true;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à gauche en haut
            if (caseRemplie[indexX - 1][indexY - 1]) {

                caseGris[indexX - 1][indexY - 1] = false;
                caseRouge[indexX - 1][indexY - 1] = true;
                tabCases[indexX - 1][indexY - 1].removeAll();
                tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
            }
        }

        //Joueur1: si le pion est dans le coin en bas à gauche
        public void j1CoinBasGauche() {
            //change le pion à droite en haut
            if (caseRemplie[indexX + 1][indexY - 1]) {
                caseGris[indexX + 1][indexY - 1] = false;
                caseRouge[indexX + 1][indexY - 1] = true;
                tabCases[indexX + 1][indexY - 1].removeAll();
                tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
            }
            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = false;
                caseRouge[indexX][indexY - 1] = true;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = false;
                caseRouge[indexX + 1][indexY] = true;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
        }

        //Joueur1: si le pion est dans la première ou la dernière colonne
        public void j1Colonnes() {
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = false;
                caseRouge[indexX][indexY + 1] = true;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }

            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {

                caseGris[indexX][indexY - 1] = false;
                caseRouge[indexX][indexY - 1] = true;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //Si le pion est dans la première colonne
            if (indexX == 0) {
                //change le pion à droite au centre
                if (caseRemplie[indexX + 1][indexY]) {
                    caseGris[indexX + 1][indexY] = false;
                    caseRouge[indexX + 1][indexY] = true;
                    tabCases[indexX + 1][indexY].removeAll();
                    tabCases[indexX + 1][indexY].setPion(joueurCourant);
                }
                //change le pion à droite en haut
                if (caseRemplie[indexX + 1][indexY - 1]) {
                    caseGris[indexX + 1][indexY - 1] = false;
                    caseRouge[indexX + 1][indexY - 1] = true;
                    tabCases[indexX + 1][indexY - 1].removeAll();
                    tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
                }
                //change le pion à droite en bas
                if (caseRemplie[indexX + 1][indexY + 1]) {
                    caseGris[indexX + 1][indexY + 1] = false;
                    caseRouge[indexX + 1][indexY + 1] = true;
                    tabCases[indexX + 1][indexY + 1].removeAll();
                    tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
                }
            } //Si le pion est dans la dernière colonne
            else if (indexX == (dimension - 1)) {
                //change le pion à gauche en bas
                if (caseRemplie[indexX - 1][indexY + 1]) {
                    caseGris[indexX - 1][indexY + 1] = false;
                    caseRouge[indexX - 1][indexY + 1] = true;
                    tabCases[indexX - 1][indexY + 1].removeAll();
                    tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
                }
                //change le pion à gauche au centre
                if (caseRemplie[indexX - 1][indexY]) {
                    caseGris[indexX - 1][indexY] = false;
                    caseRouge[indexX - 1][indexY] = true;
                    tabCases[indexX - 1][indexY].removeAll();
                    tabCases[indexX - 1][indexY].setPion(joueurCourant);
                }
                //change le pion à gauche en haut
                if (caseRemplie[indexX - 1][indexY - 1]) {
                    caseGris[indexX - 1][indexY - 1] = false;
                    caseRouge[indexX - 1][indexY - 1] = true;
                    tabCases[indexX - 1][indexY - 1].removeAll();
                    tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
                }
            }
        }

        //Joueur1: si le pion est dans la première ou la dernière rangée
        public void j1Rangees() {
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = false;
                caseRouge[indexX - 1][indexY] = true;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }
            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = false;
                caseRouge[indexX + 1][indexY] = true;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
            //Si le pion est dans la première rangée
            if (indexY == 0) {
                //change le pion à gauche en bas
                if (caseRemplie[indexX - 1][indexY + 1]) {
                    caseGris[indexX - 1][indexY + 1] = false;
                    caseRouge[indexX - 1][indexY + 1] = true;
                    tabCases[indexX - 1][indexY + 1].removeAll();
                    tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
                }

                //change le pion en bas au centre
                if (caseRemplie[indexX][indexY + 1]) {
                    caseGris[indexX][indexY + 1] = false;
                    caseRouge[indexX][indexY + 1] = true;
                    tabCases[indexX][indexY + 1].removeAll();
                    tabCases[indexX][indexY + 1].setPion(joueurCourant);
                }
                //change le pion à droite en bas
                if (caseRemplie[indexX + 1][indexY + 1]) {
                    caseGris[indexX + 1][indexY + 1] = false;
                    caseRouge[indexX + 1][indexY + 1] = true;
                    tabCases[indexX + 1][indexY + 1].removeAll();
                    tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
                }
            } //Si le pion est dans la dernière rangée
            else if (indexY == (dimension - 1)) {

                //change le pion à gauche en haut
                if (caseRemplie[indexX - 1][indexY - 1]) {
                    caseGris[indexX - 1][indexY - 1] = false;
                    caseRouge[indexX - 1][indexY - 1] = true;
                    tabCases[indexX - 1][indexY - 1].removeAll();
                    tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
                }

                //change le pion à droite en haut
                if (caseRemplie[indexX + 1][indexY - 1]) {
                    caseGris[indexX + 1][indexY - 1] = false;
                    caseRouge[indexX + 1][indexY - 1] = true;
                    tabCases[indexX + 1][indexY - 1].removeAll();
                    tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
                }

                //change le pion en haut au centre
                if (caseRemplie[indexX][indexY - 1]) {
                    caseGris[indexX][indexY - 1] = false;
                    caseRouge[indexX][indexY - 1] = true;
                    tabCases[indexX][indexY - 1].removeAll();
                    tabCases[indexX][indexY - 1].setPion(joueurCourant);
                }
            }
        }

        //Joueur1: si le pion est au centre
        public void j1Centre() {
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = false;
                caseRouge[indexX - 1][indexY] = true;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }

            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = false;
                caseRouge[indexX + 1][indexY] = true;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = false;
                caseRouge[indexX][indexY - 1] = true;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = false;
                caseRouge[indexX][indexY + 1] = true;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche en haut
            if (caseRemplie[indexX - 1][indexY - 1]) {
                caseGris[indexX - 1][indexY - 1] = false;
                caseRouge[indexX - 1][indexY - 1] = true;
                tabCases[indexX - 1][indexY - 1].removeAll();
                tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à droite en haut
            if (caseRemplie[indexX + 1][indexY - 1]) {
                caseGris[indexX + 1][indexY - 1] = false;
                caseRouge[indexX + 1][indexY - 1] = true;
                tabCases[indexX + 1][indexY - 1].removeAll();
                tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à droite en bas
            if (caseRemplie[indexX + 1][indexY + 1]) {
                caseGris[indexX + 1][indexY + 1] = false;
                caseRouge[indexX + 1][indexY + 1] = true;
                tabCases[indexX + 1][indexY + 1].removeAll();
                tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche en bas
            if (caseRemplie[indexX - 1][indexY + 1]) {
                caseGris[indexX - 1][indexY + 1] = false;
                caseRouge[indexX - 1][indexY + 1] = true;
                tabCases[indexX - 1][indexY + 1].removeAll();
                tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
            }
        }

        //Joueur2: si le pion est dans le coin en haut à gauche
        public void j2CoinHautGauche() {
            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = true;
                caseRouge[indexX + 1][indexY] = false;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = true;
                caseRouge[indexX][indexY + 1] = false;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à droite en bas
            if (caseRemplie[indexX + 1][indexY + 1]) {
                caseGris[indexX + 1][indexY + 1] = true;
                caseRouge[indexX + 1][indexY + 1] = false;
                tabCases[indexX + 1][indexY + 1].removeAll();
                tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
            }
        }

        //Joueur2: si le pion est dans le coin en haut à droite
        public void j2CoinHautDroite() {
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = true;
                caseRouge[indexX][indexY + 1] = false;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche en bas
            if (caseRemplie[indexX - 1][indexY + 1]) {
                caseGris[indexX - 1][indexY + 1] = true;
                caseRouge[indexX - 1][indexY + 1] = false;
                tabCases[indexX - 1][indexY + 1].removeAll();
                tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = true;
                caseRouge[indexX - 1][indexY] = false;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }
        }

        //Joueur2: si le pion est dans le coin en bas à droite
        public void j2CoinBasDroite() {
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = true;
                caseRouge[indexX - 1][indexY] = false;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }
            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = true;
                caseRouge[indexX][indexY - 1] = false;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à gauche en haut
            if (caseRemplie[indexX - 1][indexY - 1]) {
                caseGris[indexX - 1][indexY - 1] = true;
                caseRouge[indexX - 1][indexY - 1] = false;
                tabCases[indexX - 1][indexY - 1].removeAll();
                tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
            }
        }

        //Joueur2: si le pion est dans le coin en bas à gauche
        public void j2CoinBasGauche() {
            //change le pion à droite en haut
            if (caseRemplie[indexX + 1][indexY - 1]) {
                caseGris[indexX + 1][indexY - 1] = true;
                caseRouge[indexX + 1][indexY - 1] = false;
                tabCases[indexX + 1][indexY - 1].removeAll();
                tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
            }
            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = true;
                caseRouge[indexX][indexY - 1] = false;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = true;
                caseRouge[indexX + 1][indexY] = false;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
        }

        //Joueur2: si le pion est dans la première ou la dernière colonne
        public void j2Colonnes() {
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = true;
                caseRouge[indexX][indexY + 1] = false;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = true;
                caseRouge[indexX][indexY - 1] = false;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //Si le pion est dans la première colonne
            if (indexX == 0) {
                //change le pion à droite au centre
                if (caseRemplie[indexX + 1][indexY]) {
                    caseGris[indexX + 1][indexY] = true;
                    caseRouge[indexX + 1][indexY] = false;
                    tabCases[indexX + 1][indexY].removeAll();
                    tabCases[indexX + 1][indexY].setPion(joueurCourant);
                }
                //change le pion à droite en haut
                if (caseRemplie[indexX + 1][indexY - 1]) {
                    caseGris[indexX + 1][indexY - 1] = true;
                    caseRouge[indexX + 1][indexY - 1] = false;
                    tabCases[indexX + 1][indexY - 1].removeAll();
                    tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
                }
                //change le pion à droite en bas
                if (caseRemplie[indexX + 1][indexY + 1]) {
                    caseGris[indexX + 1][indexY + 1] = true;
                    caseRouge[indexX + 1][indexY + 1] = false;
                    tabCases[indexX + 1][indexY + 1].removeAll();
                    tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
                }
            } //Si le pion est dans la dernière colonne
            else if (indexX == (dimension - 1)) {
                //change le pion à gauche en bas
                if (caseRemplie[indexX - 1][indexY + 1]) {
                    caseGris[indexX - 1][indexY + 1] = true;
                    caseRouge[indexX - 1][indexY + 1] = false;
                    tabCases[indexX - 1][indexY + 1].removeAll();
                    tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
                }
                //change le pion à gauche au centre
                if (caseRemplie[indexX - 1][indexY]) {
                    caseGris[indexX - 1][indexY] = true;
                    caseRouge[indexX - 1][indexY] = false;
                    tabCases[indexX - 1][indexY].removeAll();
                    tabCases[indexX - 1][indexY].setPion(joueurCourant);
                }
                //change le pion à gauche en haut
                if (caseRemplie[indexX - 1][indexY - 1]) {
                    caseGris[indexX - 1][indexY - 1] = true;
                    caseRouge[indexX - 1][indexY - 1] = false;
                    tabCases[indexX - 1][indexY - 1].removeAll();
                    tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
                }
            }
        }

        //Joueur2: si le pion est dans la première ou la dernière rangée
        public void j2Rangees() {
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = true;
                caseRouge[indexX - 1][indexY] = false;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }
            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = true;
                caseRouge[indexX + 1][indexY] = false;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }

            //Si le pion est dans la première rangée
            if (indexY == 0) {
                //change le pion à gauche en bas
                if (caseRemplie[indexX - 1][indexY + 1]) {
                    caseGris[indexX - 1][indexY + 1] = true;
                    caseRouge[indexX - 1][indexY + 1] = false;
                    tabCases[indexX - 1][indexY + 1].removeAll();
                    tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
                }
                //change le pion en bas au centre
                if (caseRemplie[indexX][indexY + 1]) {
                    caseGris[indexX][indexY + 1] = true;
                    caseRouge[indexX][indexY + 1] = false;
                    tabCases[indexX][indexY + 1].removeAll();
                    tabCases[indexX][indexY + 1].setPion(joueurCourant);
                }
                //change le pion à droite en bas
                if (caseRemplie[indexX + 1][indexY + 1]) {
                    caseGris[indexX + 1][indexY + 1] = true;
                    caseRouge[indexX + 1][indexY + 1] = false;
                    tabCases[indexX + 1][indexY + 1].removeAll();
                    tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
                }
            } //Si le pion est dans la dernière rangée
            else if (indexY == (dimension - 1)) {
                //change le pion à gauche en haut
                if (caseRemplie[indexX - 1][indexY - 1]) {
                    caseGris[indexX - 1][indexY - 1] = true;
                    caseRouge[indexX - 1][indexY - 1] = false;
                    tabCases[indexX - 1][indexY - 1].removeAll();
                    tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
                }
                //change le pion à droite en haut
                if (caseRemplie[indexX + 1][indexY - 1]) {
                    caseGris[indexX + 1][indexY - 1] = true;
                    caseRouge[indexX + 1][indexY - 1] = false;
                    tabCases[indexX + 1][indexY - 1].removeAll();
                    tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
                }
                //change le pion en haut au centre
                if (caseRemplie[indexX][indexY - 1]) {
                    caseGris[indexX][indexY - 1] = true;
                    caseRouge[indexX][indexY - 1] = false;
                    tabCases[indexX][indexY - 1].removeAll();
                    tabCases[indexX][indexY - 1].setPion(joueurCourant);
                }
            }
        }

        //Joueur2: si le pion est au centre
        public void j2Centre() {
            //change le pion à gauche au centre
            if (caseRemplie[indexX - 1][indexY]) {
                caseGris[indexX - 1][indexY] = true;
                caseRouge[indexX - 1][indexY] = false;
                tabCases[indexX - 1][indexY].removeAll();
                tabCases[indexX - 1][indexY].setPion(joueurCourant);
            }

            //change le pion à droite au centre
            if (caseRemplie[indexX + 1][indexY]) {
                caseGris[indexX + 1][indexY] = true;
                caseRouge[indexX + 1][indexY] = true;
                tabCases[indexX + 1][indexY].removeAll();
                tabCases[indexX + 1][indexY].setPion(joueurCourant);
            }
            //change le pion en haut au centre
            if (caseRemplie[indexX][indexY - 1]) {
                caseGris[indexX][indexY - 1] = true;
                caseRouge[indexX][indexY - 1] = false;
                tabCases[indexX][indexY - 1].removeAll();
                tabCases[indexX][indexY - 1].setPion(joueurCourant);
            }
            //change le pion en bas au centre
            if (caseRemplie[indexX][indexY + 1]) {
                caseGris[indexX][indexY + 1] = true;
                caseRouge[indexX][indexY + 1] = false;
                tabCases[indexX][indexY + 1].removeAll();
                tabCases[indexX][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche en haut
            if (caseRemplie[indexX - 1][indexY - 1]) {
                caseGris[indexX - 1][indexY - 1] = true;
                caseRouge[indexX - 1][indexY - 1] = false;
                tabCases[indexX - 1][indexY - 1].removeAll();
                tabCases[indexX - 1][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à droite en haut
            if (caseRemplie[indexX + 1][indexY - 1]) {
                caseGris[indexX + 1][indexY - 1] = true;
                caseRouge[indexX + 1][indexY - 1] = false;
                tabCases[indexX + 1][indexY - 1].removeAll();
                tabCases[indexX + 1][indexY - 1].setPion(joueurCourant);
            }
            //change le pion à droite en bas
            if (caseRemplie[indexX + 1][indexY + 1])
            {
                caseGris[indexX + 1][indexY + 1] = true;
                caseRouge[indexX + 1][indexY + 1] = false;
                tabCases[indexX + 1][indexY + 1].removeAll();
                tabCases[indexX + 1][indexY + 1].setPion(joueurCourant);
            }
            //change le pion à gauche en bas
            if (caseRemplie[indexX - 1][indexY + 1])
            {
                caseGris[indexX - 1][indexY + 1] = true;
                caseRouge[indexX - 1][indexY + 1] = false;
                tabCases[indexX - 1][indexY + 1].removeAll();
                tabCases[indexX - 1][indexY + 1].setPion(joueurCourant);
            }
        }

        
        public void superRedd()
        {
            pionCourant=caseCourant.getPion();
            pionCourant.add(new SuperRedd());
            superSelect=false;
        }
        
        //Gestion du nombre de pions de chaque joueur
        public void nbPions() {
            pions1 = 0; //nb de pions rouges
            pions2 = 0; //nb de pions gris

            for (int i = 0; i < dimension; i++)
            {
                for (int j = 0; j < dimension; j++)
                {
                    if (caseRouge[i][j] == true)
                    {
                        pions1++;
                    }
                }
            }
            for (int i = 0; i < dimension; i++)
            {
                for (int j = 0; j < dimension; j++)
                {
                    if (caseGris[i][j] == true)
                    {
                        pions2++;
                    }
                }
            }
            fenetre.lblPoint1.setText("Pions rouges: " + pions1);
            fenetre.lblPoint2.setText("Pions gris: " + pions2);
        }
        
        public void finPartie()
        {                      
            if(!fin)
            {
                fin=true;
                for (int i = 0; i < dimension; i++)
                {
                    for (int j = 0; j < dimension; j++)
                    {
                        if(!caseRemplie[i][j])
                        {
                            fin=false;
                        }
                    }
                }
            }
            if(fin)
            {
                if(pions1>pions2)
                {
                    JOptionPane.showMessageDialog(fenetre, "Le joueur 1 a gagné");
                }
                else if(pions1 < pions2)
                {
                    JOptionPane.showMessageDialog(fenetre, "Le joueur 2 a gagné");
                }
                else
                {
                    JOptionPane.showMessageDialog(fenetre, "Il y a égalité!");
                }
            }
            if(pions1==0)
            {
                fin=true;
                JOptionPane.showMessageDialog(fenetre, "Le joueur 2 a gagné");
            }
            if(pions2==0)
            {
                fin=true;
                JOptionPane.showMessageDialog(fenetre, "Le joueur 1 a gagné");
            }

        }
        
        
        public void reinitialise() 
        {
            for (int i = 0; i < dimension; i++) {
                for (int j = 0; j < dimension; j++) {
                    tabCases[i][j].removeAll();
                    caseRemplie[i][j] = false; //toutes les cases sont initialisées à vides
                    caseDeplacer[i][j] = false;
                    caseDoubler[i][j] = false;
                    caseGris[i][j] = false;
                    caseRouge[i][j] = false;
                }
            }
            caseRemplie[0][0] = true;
            caseRemplie[dimension - 1][dimension - 1] = true;
            caseRemplie[dimension - 1][0] = true;
            caseRemplie[0][dimension - 1] = true;
            caseRouge[0][0] = true;
            caseRouge[dimension - 1][dimension - 1] = true;
            caseGris[dimension - 1][0] = true;
            caseGris[0][dimension - 1] = true;

            //Création pions
            tabCases[0][0].setPion(Damier.Joueur.JOUEUR1);
            tabCases[dimension - 1][dimension - 1].setPion(Damier.Joueur.JOUEUR1);
            tabCases[0][dimension - 1].setPion(Damier.Joueur.JOUEUR2);
            tabCases[dimension - 1][0].setPion(Damier.Joueur.JOUEUR2);

            //Reinitialisation variables
            caseCourant = null;
            caseCliquee = null;
            valide = false; //si la case contient un pion donc peut être cliquée la 1ere fois
            pionClique = null;
            action = 0;
            super1 = false;
            super2 = false;
            fenetre.chkSuper.setEnabled(false);
            joueurCourant = Joueur.JOUEUR1;

            nbPions(); //détermine le nb de pions de chaque couleur

            fenetre.getRootPane().revalidate();
            fenetre.repaint();
        }
    }
}
